<?php

/**
 * 数据请求类
 * Class Input
 */
class Input
{
    /** 过滤参数 */
    private $filter = null;

    /** @var null  */
    static $instance = null;

    /**
     * 获取类实例对象
     *
     * @return Input|null
     */
    static public function getInstance()
    {
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    /**
     * 设置过滤项
     *
     * @param null $filter
     * @return $this
     */
    public function filter($filter = null)
    {
        $this->filter = $filter;

        return $this;
    }

    /**
     * 过滤设置项
     *
     * @param $array 原始数组
     */
    private function _filter(&$array)
    {
        $filter = $this->filter;
        if (is_array($filter)) {
            foreach ($filter as $key => $item) {
                if (is_array($item) && $key == 'params'){
                    foreach ($array as $k => $value) {
                        if (in_array($k, $item)) {
                            unset($array[$k]);
                        }
                    }
                } elseif ($key == 'empty') {
                    foreach ($array as $k => $item){
                        if (!strlen($k)) {
                            unset($array[$k]);
                        }
                    }
                }
            }
        } elseif (is_string($filter)) {
            if ($filter == 'empty') {
                foreach ($array as $k => $item) {
                    if (!strlen($item)) {
                        unset($array[$k]);
                    }
                }
            }
        }
    }

    /**
     * 获取数组数值
     *
     * @param $array 原始数组
     * @param null $name 索引名称
     * @param null $defaultValue 默认值
     * @return null
     */
    private function _fetch_from_array(&$array, $name = null, $defaultValue = null)
    {
        if (!isset($array[$name])) {
            return $defaultValue;
        }

        return $array[$name];
    }

    /**
     * 获取POST方式请求数据
     *
     * @param null $name 索引名称
     * @param null $defaultValue 默认值
     * @return null
     */
    public function post($name = null, $defaultValue = null)
    {
        $this->_filter($_POST);
        if ($name) {
            return $this->_fetch_from_array($_POST, $name, $defaultValue);
        }

        return $_POST;
    }

    /**
     * 获取GET方式请求数据
     *
     * @param null $name 索引名称
     * @param null $defaultValue 默认值
     * @return null
     */
    public function get($name = null, $defaultValue = null)
    {
        $this->_filter($_GET);
        if ($name) {
            return $this->_fetch_from_array($_GET, $name, $defaultValue);
        }

        return $_GET;
    }

    /**
     * 获取请求数据
     *
     * @param null $name 索引名称
     * @param null $defaultValue 默认值
     * @return null
     */
    public function request($name = null, $defaultValue = null)
    {
        $this->_filter($_POST);
        $this->_filter($_GET);

        if (!$name) {
            return $_REQUEST;
        }

        if (!isset($_POST[$name])) {
            return $this->get($name, $defaultValue);
        } else {
            return $this->post($name, $defaultValue);
        }
    }

    /**
     * 获取SERVER方式请求数据
     *
     * @param null $name 索引名称
     * @param null $defaultValue 默认值
     * @return null
     */
    public function server($name = null, $defaultValue = null)
    {
        $this->_filter($_SERVER);
        if (!$name) {
            return $_SERVER;
        }

        return $this->_fetch_from_array($_SERVER, $name, $defaultValue);
    }

    /**
     * 判断是否POST请求方式
     *
     * @return bool 返回布尔值
     */
    public function isPost()
    {
        $request_method = $_SERVER['REQUEST_METHOD'];
        if ($request_method === 'POST') {
            return true;
        }

        return false;
    }

    /**
     * 判断是否GET请求方式
     *
     * @return bool 返回布尔值
     */
    public function isGet()
    {
        $request_method = $_SERVER['REQUEST_METHOD'];
        if ($request_method === 'GET') {
            return true;
        }

        return false;
    }

    /**
     * 判断是否REQUEST请求
     *
     * @param string $method 请求方式
     * @return bool 返回布尔值
     */
    public function isRequest($method = '')
    {
        $method = strtolower(trim($method));
        $request_method = strtolower($_SERVER['REQUEST_METHOD']);
        if ($request_method === $method) {
            return true;
        }

        return false;
    }

    /**
     * 判断是否AJAX请求
     *
     * @return bool 返回布尔值
     */
    public function isAjax()
    {
        return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
    }

}
